/*
 * @Description: 斗地主游戏 测试类
 * @Author: rendc
 * @Date: 2025-08-15 10:00:12
 * @LastEditors: rendc
 * @LastEditTime: 2025-08-15 11:35:54
 */

import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

public class CardGame {

  public static void main(String[] args) {
    // 排序 自然排序 和 选择器排序
    // 生成54张扑克牌
    Map<String, Integer> map = new HashMap<>();
    // 存放54张扑克牌
    List<Card> cardsList = new ArrayList<>();
    // 牌面数字 权重
    for (Integer i = 1; i < 9; i++) {
      map.put((i + 2 + ""), i);
    }
    map.put("J", 9);
    map.put("Q", 10);
    map.put("K", 11);
    map.put("A", 12);
    map.put("2", 13);
    map.put("小王", 14);
    map.put("大王", 15);
    // System.out.println(map);
    // 花色
    List<String> colors = new ArrayList<>();
    // 添加花色
    colors.add("♦");
    colors.add("♥");
    colors.add("♠");
    colors.add("♣");
    // System.out.println("colors:" + colors);
    // 数字
    List<String> numbers = new ArrayList<>();
    // 添加数字
    Collections.addAll(numbers, "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
    // System.out.println("numbers:" + numbers);
    // 生成所有的牌
    for (int i = 0; i < colors.size(); i++) {
      // 获取花色
      String color = colors.get(i);
      // System.out.println("color:" + color);
      for (int j = 0; j < numbers.size(); j++) {
        // 获取牌面数字值
        String number = numbers.get(j);
        // 获取权重值
        int weight = map.get(number);
        // 造扑克牌
        Card card = new Card(number, color, weight);
        // System.out.println(card);
        cardsList.add(card);
      }
    }
    // 4*13 = 52
    // 生成大小王
    cardsList.add(new Card("小王", "", map.get("小王")));
    cardsList.add(new Card("大王", "", map.get("大王")));
    // 54张牌
    System.out.println("cardsList.size():" + cardsList.size());
    // 洗牌：将54张牌随机打乱
    // 洗牌方法1 随机 顺序 乱序 不按插入的顺序
    // 【还有没有其他方法】
    // Collections.shuffle(cardsList);
    // System.out.println(cardsList);
    // 发牌
    // 准备三个玩家
    List<Card> player1 = new ArrayList<>();
    List<Card> player2 = new ArrayList<>();
    List<Card> player3 = new ArrayList<>();
    List<Card> dipai = new ArrayList<>();
    // 三人交替摸牌，最后三张底牌不能摸
    for (int i = 0; i < cardsList.size(); i++) {
      Card c = cardsList.get(i);
      // 第1轮 i：0 0%3 0
      // 第2轮 i：1 1%3 1
      // 第3轮 i：2 2%3 2
      // 第4轮 i：3 3%3 0
      if (i >= cardsList.size() - 3) {
        dipai.add(c);
      } else if (i % 3 == 0) {
        player1.add(c);
      } else if (i % 3 == 1) {
        player2.add(c);
      } else if (i % 3 == 2) {
        player3.add(c);
      }
    }
    // 查看三人各自手中的牌和底牌，要求按牌的大小顺序展示
    // 比较器排序
    Comparator<Card> comp = new Comparator<Card>() {

      @Override
      public int compare(Card o1, Card o2) {
        int num = o1.getWeight() - o2.getWeight();
        if (num == 0) {
          // 按照花色排序
          num = o1.getColor().compareTo(o2.getColor());
        }
        return num;
      };

    };
    // 排序
    Collections.sort(player1, comp);
    Collections.sort(player2, comp);
    Collections.sort(player3, comp);
    Collections.sort(dipai, comp);
    System.out.println("player1:" + player1);
    System.out.println("player2:" + player2);
    System.out.println("player3:" + player3);
    System.out.println("dipai:" + dipai);
  }
}